home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 1992 August / info-mac-1992.iso / Applications (app) / STvi / stevie 3.10 / param.c < prev    next >
Text File  |  1991-01-03  |  4KB  |  170 lines

  1. /* $Header: /nw/tony/src/stevie/src/RCS/param.c,v 1.10 89/08/02 10:59:10 tony Exp $
  2.  *
  3.  * Code to handle user-settable parameters. This is all pretty much table-
  4.  * driven. To add a new parameter, put it in the params array, and add a
  5.  * macro for it in param.h. If it's a numeric parameter, add any necessary
  6.  * bounds checks to doset(). String parameters aren't currently supported.
  7.  */
  8.  
  9. #include "stevie.h"
  10.  
  11. struct    param    params[] = {
  12.  
  13.     { "tabstop",    "ts",        8,    P_NUM },
  14.     { "scroll",    "scroll",    12,    P_NUM },
  15.     { "report",    "report",    5,    P_NUM },
  16.     { "lines",    "li",    25,    P_NUM },
  17.     { "columns", "co",    80,    P_NUM },
  18.  
  19.     { "vbell",    "vb",        TRUE,    P_BOOL },
  20.     { "showmatch",    "sm",        FALSE,    P_BOOL },
  21.     { "wrapscan",    "ws",        TRUE,    P_BOOL },
  22.     { "errorbells",    "eb",        FALSE,    P_BOOL },
  23.     { "showmode",    "mo",        FALSE,    P_BOOL },
  24.     { "backup",    "bk",        FALSE,    P_BOOL },
  25.     { "return",    "cr",        TRUE,    P_BOOL },
  26.     { "list",    "list",        FALSE,    P_BOOL },
  27.     { "ignorecase",    "ic",        FALSE,    P_BOOL },
  28.     { "autoindent",    "ai",        FALSE,    P_BOOL },
  29.     { "number",    "nu",        FALSE,    P_BOOL },
  30.     { "modelines",    "ml",        FALSE,    P_BOOL },
  31.     { "tildeop",    "to",        FALSE,    P_BOOL },
  32.     { "terse",    "terse",    FALSE,    P_BOOL },
  33.     { "",        "",        0,    0, }        /* end marker */
  34.  
  35. };
  36.  
  37. static    void    showparms();
  38.  
  39. void
  40. doset(arg)
  41. char    *arg;        /* parameter string */
  42. {
  43.     register int    i;
  44.     register char    *s;
  45.     bool_t    did_lines = FALSE;
  46.     bool_t    did_columns = FALSE;
  47.     bool_t    state = TRUE;        /* new state of boolean parms. */
  48.  
  49.     if (arg == NULL) {
  50.         showparms(FALSE);
  51.         return;
  52.     }
  53.     if (strncmp(arg, "all", 3) == 0) {
  54.         showparms(TRUE);
  55.         return;
  56.     }
  57.     if (strncmp(arg, "no", 2) == 0) {
  58.         state = FALSE;
  59.         arg += 2;
  60.     }
  61.  
  62.     for (i=0; params[i].fullname[0] != NUL ;i++) {
  63.         s = params[i].fullname;
  64.         if (strncmp(arg, s, strlen(s)) == 0)    /* matched full name */
  65.             break;
  66.         s = params[i].shortname;
  67.         if (strncmp(arg, s, strlen(s)) == 0)    /* matched short name */
  68.             break;
  69.     }
  70.  
  71.     if (params[i].fullname[0] != NUL) {    /* found a match */
  72.         if (params[i].flags & P_NUM) {
  73.             did_lines = (i == P_LI);
  74.             did_columns = (i == P_CO);
  75.             if (arg[strlen(s)] != '=' || state == FALSE)
  76.                 emsg("Invalid set of numeric parameter");
  77.             else {
  78.                 params[i].value = atoi(arg+strlen(s)+1);
  79.                 params[i].flags |= P_CHANGED;
  80.             }
  81.         } else /* boolean */ {
  82.             if (arg[strlen(s)] == '=')
  83.                 emsg("Invalid set of boolean parameter");
  84.             else {
  85.                 params[i].value = state;
  86.                 params[i].flags |= P_CHANGED;
  87.             }
  88.         }
  89.     } else
  90.         emsg("Unrecognized 'set' option");
  91.  
  92.     /*
  93.      * Update the screen in case we changed something like "tabstop"
  94.      * or "list" that will change its appearance.
  95.      */
  96.     updatescreen();
  97.  
  98.     if (did_lines || did_columns) {
  99.         Rows = P(P_LI);
  100.         Columns = P(P_CO);
  101. #ifdef MACINTOSH
  102.         windresize();        /* Might be handy for other systems. */
  103. #endif
  104.         screenalloc();        /* allocate new screen buffers */
  105.         screenclear();
  106.         updatescreen();
  107.     }
  108.     /*
  109.      * Check the bounds for numeric parameters here
  110.      */
  111.     if (P(P_TS) <= 0 || P(P_TS) > 32) {
  112.         emsg("Invalid tab size specified");
  113.         P(P_TS) = 8;
  114.         return;
  115.     }
  116.  
  117.     if (P(P_SS) <= 0 || P(P_SS) > Rows) {
  118.         emsg("Invalid scroll size specified");
  119.         P(P_SS) = 12;
  120.         return;
  121.     }
  122.  
  123. #ifndef    TILDEOP
  124.     if (P(P_TO)) {
  125.         emsg("Tilde-operator not enabled");
  126.         P(P_TO) = FALSE;
  127.         return;
  128.     }
  129. #endif
  130.     /*
  131.      * Check for another argument, and call doset() recursively, if
  132.      * found. If any argument results in an error, no further
  133.      * parameters are processed.
  134.      */
  135.     while (*arg != ' ' && *arg != '\t') {    /* skip to next white space */
  136.         if (*arg == NUL)
  137.             return;            /* end of parameter list */
  138.         arg++;
  139.     }
  140.     while (*arg == ' ' || *arg == '\t')    /* skip to next non-white */
  141.         arg++;
  142.  
  143.     if (*arg)
  144.         doset(arg);    /* recurse on next parameter */
  145. }
  146.  
  147. static    void
  148. showparms(all)
  149. bool_t    all;    /* show ALL parameters */
  150. {
  151.     register struct    param    *p;
  152.     char    buf[64];
  153.  
  154.     gotocmd(TRUE, 0);
  155.     outstr("Parameters:\r\n");
  156.  
  157.     for (p = ¶ms[0]; p->fullname[0] != NUL ;p++) {
  158.         if (!all && ((p->flags & P_CHANGED) == 0))
  159.             continue;
  160.         if (p->flags & P_BOOL)
  161.             sprintf(buf, "\t%s%s\r\n",
  162.                 (p->value ? "" : "no"), p->fullname);
  163.         else
  164.             sprintf(buf, "\t%s=%d\r\n", p->fullname, p->value);
  165.  
  166.         outstr(buf);
  167.     }
  168.     wait_return();
  169. }
  170.